架构演进的必然性
没有一种架构是万能的。系统的架构会随着业务规模、团队能力、技术生态的变化而持续演进。理解架构演进的规律,比记住某种特定架构模式更重要。
架构演进的典型路径
阶段一:单体架构
项目初期,所有功能打包在一个应用中。开发快速、部署简单、团队协作直接。
适用条件:团队规模小(3-5人)、业务相对简单、迭代速度快。
痛点:随着业务增长,代码耦合严重、部署效率下降、扩展困难。
阶段二:模块化单体
在单体架构的基础上,按业务模块组织代码,各模块之间通过明确的接口通信。虽然还是单一部署单元,但代码结构已经为后续拆分做好了准备。
适用条件:团队增长到10人左右、业务模块清晰、有意识地为微服务做准备。
阶段三:服务化架构
将部分高频模块(如用户服务、支付服务)拆分为独立服务,其余模块仍保持单体。
适用条件:特定模块有明确的性能瓶颈或需要独立扩展。
阶段四:微服务架构
所有业务模块都拆分为独立的微服务,每个服务独立开发、部署、扩展。
适用条件:团队规模大(50+人)、业务复杂、各模块负载差异大。
阶段五:服务网格(Service Mesh)
在微服务架构之上引入服务网格(如Istio),将服务间通信、熔断、限流等横切关注点从代码中抽离到基础设施层。
适用条件:微服务数量极多(100+)、运维复杂度高、需要统一的服务治理。
微服务架构的核心模式
API网关模式
所有外部请求通过API网关进入系统,网关负责:
- 请求路由(将请求转发到对应的服务)
- 认证授权(统一鉴权)
- 限流熔断(保护后端服务)
- 日志监控(统一接入点)
服务间通信模式
| 通信方式 | 适用场景 | 特点 |
|---|---|---|
| REST API | 通用场景 | 简单、通用、可读性好 |
| gRPC | 高性能场景 | 二进制协议、性能高 |
| 消息队列 | 异步场景 | 解耦、削峰填谷 |
数据管理模式
- 每个服务独立数据库:避免服务间数据耦合
- CQRS(命令查询职责分离):读写分离,优化查询性能
- Saga模式:分布式事务管理,通过编排一系列本地事务实现最终一致性
服务发现模式
服务实例动态变化(扩缩容、故障恢复),需要一个注册中心来管理服务的地址信息:
- 客户端发现:客户端查询注册中心,自行选择服务实例(如Nacos + Ribbon)
- 服务端发现:客户端请求网关,网关负责服务发现和负载均衡(如Nginx + K8s Service)
架构演进的原则
- 不要过度设计:满足当前需求 + 适度前瞻,不要为了微服务而微服务
- 渐进式演进:逐步拆分,每次只解决一个最痛的问题
- 业务驱动:架构演进的动力来自业务需求,不是技术执念
- 团队能力匹配:微服务架构对团队能力要求很高,人员储备不足时不要贸然全面微服务化
- 可回退:每次架构变更都要保证可以回退,避免"一拆就散"的灾难
↑